import numpy as np
from collections import defaultdict

__all__ = ['Index','find_index', 'apply_mapping','calculate']


'''找一个元素出现的位置（基本不用）'''
def Index(array2: np.array, target: int,return_type=list):
    '''
    :param array2: 用于匹配的二维数组
    :param target: 用于匹配的值
    :param return_type: ①list: return like [(0, 2), (0, 3), (1, 0), (1, 4), (2, 2), (2, 5)];②other: return like {0:[1,3,5],1:[0,2,4]}
    :return: 坐标信息
    '''
    indices = find_index(array2, target)
    if return_type==list:
        coordinates = list(zip(indices[0], indices[1]))
    else:
        coordinates = defaultdict(list)
        for column, row in zip(indices[0], indices[1]):
            coordinates[column].append(row)

    return coordinates

def find_index(array2: np.array, target: int) -> np.array:
    """
    在二维数组中查找目标值，并返回其索引位置。
    :param array2: 二维数组
    :param target: 目标值
    :return: 目标值在二维数组中的索引位置，如果不存在则返回空数组
    """
    indices = np.where(array2 == target)
    return np.array(indices)


'''把一些数字应用映射表，如：

1. 地支数转五行数
    `self._wx = apply_mapping(self.zhi, ZHI_TO_WX)`
2. 地支数转地支名
    `self.Zhi = apply_mapping(self.zhi, ZHI)`
'''
def apply_mapping(array2: np.array, mapping) -> np.array:
    return np.array([[mapping[l] if l != -1 else l for l in lines] for lines in array2], dtype=np.int8)




if __name__ == '__main__':
    # 定义二维数组
    array2 = np.array([
        [1, 2, 5],
        [4, 5, 6],
        [7, 8, 5]
    ])

    # 查找目标值 5 的索引
    target = 5
    indices = find_index(array2, target)

    print("Indices of target value:")
    print(indices)

    # 将行索引和列索引组合成坐标对